#ifndef VISIYUNSDK_H
#define VISIYUNSDK_H

#include "CameraSDKInterface.h"
#include <QMap>
#include <QWidget>
#include <QDialog>
#include "VisiyunDevice.h"
#include "CameraTriggerSettings.h"
#include "CameraParametersWidget.h"


#define DEFAULT_CAMERA_IP "192.168.1.10"

/**
 * @brief Visiyun相机SDK的具体实现类
 * @details 继承自CameraSDKInterface，提供Visiyun相机的初始化、反初始化、功能调用等接口
 */
class VisiyunSDK : public CameraSDKInterface {
    Q_OBJECT
    Q_INTERFACES(SDKInterface)
    Q_PLUGIN_METADATA(IID SDKINTERFACE_IID)
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针（默认nullptr）
     */
    explicit VisiyunSDK(QObject *parent = nullptr);

    /**
     * @brief 析构函数（自动反初始化SDK）
     */
    ~VisiyunSDK() override;

    /**
     * @brief 打开设备连接
     * @param params 连接参数，应为QString类型的设备IP地址
     * @return 连接成功返回true，IP无效或连接失败返回false
     */
    bool openDevice(const QVariant& params) override;

    /**
     * @brief 关闭指定设备连接
     * @param params 设备标识参数，应为QString类型的设备IP地址
     */
    void closeDevice(const QVariant& params) override;

    /**
     * @brief 关闭所有设备连接
     */
    void closeAllDevices() override;

    /**
     * @brief 获取SDK名称
     * @return 字符串"VisiyunSDK"
     */
    QString sdkName() const override;

    /**
     * @brief 获取SDK版本号
     * @return 字符串"1.0.0"
     */
    QString SDKVersion() const override;

    /**
     * @brief 搜索可用的Visiyun相机设备
     * @param devices 输出参数，存储搜索到的设备列表
     * @return 搜索成功返回true
     */
    bool searchDevices(QList<QVariant>& devices) override;

    /**
     * @brief 获取设备固件版本
     * @param deviceId 设备ID
     * @return 固件版本字符串，失败返回空字符串
     */
    int getDeviceFirmwareVersion(const QVariant& deviceId) override;

    /**
     * @brief 获取设备像素尺寸
     * @param deviceId 设备ID
     * @return QSize对象(宽x高)，失败返回空尺寸
     */
    QSize getDevicePixelSize(const QVariant& deviceId) override;

    /**
     * @brief 设置图像采集回调函数
     * @param deviceId 设备ID
     * @param callback 回调函数指针
     */
    void setImageCaptureCallback(const QVariant& deviceId, ImageCallback callback) override;

    /**
     * @brief 取消图像采集回调函数
     * @param deviceId 设备ID
     */
    void unsetImageCaptureCallback(const QVariant& deviceId) override;

    /**
     * @brief 获取快速参数设置Widget
     * @param deviceId 设备ID
     * @param parent 父Widget
     * @return 快速参数设置Widget指针
     */
    QWidget* getQuickParametersWidget(const QVariant& deviceId, QWidget* parent = nullptr) override;

    /**
     * @brief 获取参数设置对话框
     * @param deviceId 设备ID
     * @param parent 父Widget
     * @return 参数设置对话框指针
     */
    QDialog* getParametersDialog(const QVariant& deviceId, QWidget* parent = nullptr) override;
    
    /**
     * @brief 设置设备触发模式
     * @param deviceId 设备ID
     * @param triggerMode 触发模式，使用TRIGGER_MODE_*宏定义
     * @return 设置成功返回true，失败返回false
     */
    bool setDeviceTriggerMode(const QVariant& deviceId, int triggerMode) override;
    
    /**
     * @brief 设置设备参数
     * @param deviceId 设备ID
     * @param params 设备参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    bool setDeviceParameters(const QVariant& deviceId, const QVariantMap& params) override;
    
    /**
     * @brief 获取设备参数
     * @param deviceId 设备ID
     * @param configName 配置名称输出
     * @param params 设备参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    bool getDeviceParameters(const QVariant& deviceId, QString& configName, QVariantMap& params) override;
    
    /**
     * @brief 设置预设参数
     * @param params 预设参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    bool setPresetParameters(const QVariantMap& params) override;
    
    /**
     * @brief 获取预设参数
     * @param configName 配置名称输出
     * @param params 预设参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    bool getPresetParameters(QString& configName, QVariantMap& params) override;

private:
    struct VisiyunDeviceInfo
    {
       //相机设备控制指针
       VisiyunDevice * pVisiyunDevice;
       //相机参数设置对话框
       CameraTriggerSettings * pCameraTriggerSettings;
       //相机快捷设置widge指针
       CameraParametersWidget * pCameraParametersWidget;
    };
    QMap<QString, VisiyunDeviceInfo> m_deviceMap; // 存储设备IP与设备实例的映射关系
};

#endif // VISIYUNSDK_H
